package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
@PropertySource("classpath:/properties/image.properties")
public class FileServiceImpl implements FileService {

	@Value("${image.dirPath}")
	private String dirPath;

	@Value("${image.urlPath}")
	private String urlPath;

	//为了防止Set集合每次都要创建,通过static代码块的形式负责封装数据
	private static final Set<String> imageSet = new HashSet<>();

	static {
		imageSet.add(".jpg");
		imageSet.add(".png");
		imageSet.add(".gif");
	}

	/**
	 * 文件上传具体步骤
	 * 1.如何校验用户上传的是图片			jpg/png
	 * 2.如何防止用户上传恶意程序			木马.exe.jpg
	 * 3.应该采用分目录存储的方式			保存数据
	 * 4.上传的文件名称应该尽量避免重名	自定义文件名称
	 */
	@Override
	public ImageVO upload(MultipartFile uploadFile) {
		//1.校验图片类型是否正确		1.正则	2.添加集合Set 去重
		//1.1 获取上传的图片类型
		String fileName = uploadFile.getOriginalFilename(); //全名  xxx.jpg
		fileName.toLowerCase(); //全小写
		//1.2判断是否为图片类型
		String fileType = fileName.substring(fileName.lastIndexOf("."));
		if (!imageSet.contains(fileType)) {
			return ImageVO.fail();
		}

		//2.上传的数据是否为恶意程序, 高度和宽度是否为null. 利用图片API
		//BufferedImage
		try {
			BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
			int width = bufferedImage.getWidth();
			int height = bufferedImage.getHeight();
			if (width == 0 || height == 0) {
				return ImageVO.fail();
			}

			String format = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
			String finalPath = dirPath + format;
			File file = new File(finalPath);
			if (!file.exists()) {
				file.mkdirs();
			}

			String uuid = UUID.randomUUID().toString().replace("-", "");
			String realName = uuid + fileType;
			String finalName = finalPath + realName;
			File finalFinal = new File(finalName);
			uploadFile.transferTo(finalFinal);

			//5.动态生成url地址	请求协议
			String url = urlPath + format + realName;
			return ImageVO.success(url, width, height);

		} catch (IOException e) {
			e.printStackTrace();
			return ImageVO.fail();
		}

		//3.采用分目录存储的方式
		//3.1分目录存储方式1 hash方式
		//3.1分目录存储方式2 时间方式存储 yyyy/MM/dd
		//3.2准备文件存储的目录

		//4.实现文件的上传
		//4.1 动态拼接文件名称
		//4.2 准备文件上传的全路径	磁盘路径地址+文件名称
		//4.3 实现文件上传
	}
}
